{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "b4f794de",
   "metadata": {},
   "source": [
    "- `transpose`: `torch.transpose(input, dim0, dim1)`\n",
    "    - `swapaxies`/`swapdims`\n",
    "        - `torch.swapaxes(input, axis0, axis1)`: Alias for `torch.transpose()`.\n",
    "        - `torch.swapdims(input, dim0, dim1)`: Alias for `torch.transpose()`.\n",
    "    - `permute`\n",
    "        - `transpose` 只交换两个轴（axis），`permute` 可以对所有的轴进行重排序\n",
    "    - `torch.einsum()`\n",
    "    - `.T`\n",
    "- 变换的是轴（axis/dimension），在内存上的存储未变，变换的是各个轴上的 stride；\n",
    "    - 影响的只是 view 视图方式，即以什么样的顺序或维度来查看或者使用这个 tensor\n",
    "    - 内存上，越后边的维度越相连，实际应用中，大部分的变换都是集中中最后的几个轴里的；\n",
    "        - 或者理解上从物理意义出发，每个轴都有自己的实际具体含义\n",
    "        ```\n",
    "        # [1, 8, 32, 128]\n",
    "        # [bsz, seqlen, heads, head_dim]\n",
    "        keys = keys.transpose(1, 2)\n",
    "        # [1, 32, 8, 128]\n",
    "        # [bsz, heads, seqlen, head_dim]\n",
    "        \n",
    "        # xq: [1, 8, 32, 128]\n",
    "        xq = xq.transpose(1, 2)\n",
    "        # [1, 32, 8, 128]\n",
    "        \n",
    "        # keys.transpose(2, 3): [1, 8, 128, 8]\n",
    "        torch.matmul(xq, keys.transpose(2, 3)) / math.sqrt(128)\n",
    "        # [1, 32, 8, 8]\n",
    "        ```\n",
    "- torch 中的 tensor 与 numpy 中的 ndarray 用法上几乎没有差别"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "5c3bcc4c",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-10-15T01:33:29.916276Z",
     "start_time": "2023-10-15T01:33:29.910133Z"
    }
   },
   "outputs": [],
   "source": [
    "from IPython.display import Image\n",
    "import torch"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "fb51ade3",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-10-15T01:34:08.720935Z",
     "start_time": "2023-10-15T01:34:08.709034Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[[ 0,  1,  2,  3],\n",
       "         [ 4,  5,  6,  7]],\n",
       "\n",
       "        [[ 8,  9, 10, 11],\n",
       "         [12, 13, 14, 15]]])"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = torch.arange(16).reshape(2, 2, 4)\n",
    "x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "9cec85ae",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-10-15T03:52:39.665379Z",
     "start_time": "2023-10-15T03:52:39.657506Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[0, 1, 2, 3],\n",
       "        [4, 5, 6, 7]])"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# x[0]\n",
    "x[0, :, :]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "id": "d2d47ec5",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-10-15T03:52:46.123547Z",
     "start_time": "2023-10-15T03:52:46.113110Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[ 8,  9, 10, 11],\n",
       "        [12, 13, 14, 15]])"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# x[1]\n",
    "x[1, :, :]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "c0947c82",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-10-15T01:56:30.730726Z",
     "start_time": "2023-10-15T01:56:30.725481Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 内存上，越后边的维度越相连，\n",
    "# 从后往前拓展, axis2->axis1->axis0\n",
    "Image('./imgs/axis0-1-2.png')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "id": "ba150456",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-10-15T03:54:22.279400Z",
     "start_time": "2023-10-15T03:54:22.270784Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([ 8,  9, 10, 11])"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x[1, 0, :]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "6fdd8fb2",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-10-15T01:34:14.043178Z",
     "start_time": "2023-10-15T01:34:14.035110Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x.is_contiguous()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "d18dd431",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-10-15T01:34:58.735374Z",
     "start_time": "2023-10-15T01:34:58.728745Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "torch.int64"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x.dtype"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "db1467ef",
   "metadata": {},
   "source": [
    "## 内存结构分析"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "171c1d11",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-10-15T03:54:57.036809Z",
     "start_time": "2023-10-15T03:54:57.029946Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(8, 4, 1)"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# [2, 2, 4]\n",
    "# 8: 2*4\n",
    "# 4: 4\n",
    "# 1: 1\n",
    "x.stride()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "ae0696f5",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-10-15T01:37:11.288979Z",
     "start_time": "2023-10-15T01:37:11.281252Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoEAAADACAYAAAB7yLlYAAAgAElEQVR4Xu2dB3wU1fbHvxO6VLGXZ29/xaeQBBCVZ38CKipPxIaIvQMW7L1hQQVF7IKoiIigAnYRFRFC8fnsYG9YEAJKz/w/Z2Y22cSEZHd2N7PZ3/mYDyY7c+fc773J/vbce89xkImACIiACIiACIiACOQcASfneqwOi4AIiIAIiIAIiIAIIBGoSSACIiACIiACIiACOUhAIjAHB11dFgEREAEREAEREAGJQM0BERABERABERABEchBAhKBOTjo6rIIiIAIiIAIiIAISARqDoiACIiACIiACIhADhKQCMzBQVeXRUAEREAEREAEREAiUHNABERABERABERABHKQgERgDg66uiwCIiACIiACIiACEoGaAyIgAiIgAiIgAiKQgwQkAnNw0NVlERABERABERABEZAI1BwQAREQAREQAREQgRwkIBGYg4OuLouACIiACIiACIiARKDmgAiIgAiIgAiIgAjkIAGJwBwcdHVZBERABERABERABCQCNQdEQAREQAREQAREIAcJSATm4KCryyIgAiIgAiIgAiIgEag5IAIiIAIiIAIiIAI5SEAiMAcHXV0WAREQAREQAREQAYlAzQEREAEREAEREAERyEECEoE5OOjqsgiIgAiIgAiIgAhIBGoOiIAIiIAIiIAIiEAOEpAIzMFBV5dFQAREQAREQAREQCJQc0AEREAEREAEREAEcpCARGAODrq6LAIiIAIiIAIiIAISgZoDIiACIiACIiACIpCDBCQCc3DQ1WUREAEREAEREAERkAjUHBABERABERABERCBHCQgEZiDg64ui4AIiIAIiIAIiIBEoOaACIiACIiACIiACOQgAYnAHBx0dVkEREAEREAEREAEJAI1B0RABERABERABEQgBwlIBObgoKvLIiACIiACIiACIiARqDkgAiIgAiIgAiIgAjlIQCIwBwddXRYBERABERABERABiUDNAREQAREQAREQARHIQQISgTk46OqyCIiACIiACIiACEgEag6IgAiIgAiIgAiIQA4SkAjMwUFXl0VABERABERABERAIlBzQAREQAREQAREQARykIBEYA4OurosAiIgAiIgAiIgAlETgQ8B9YE+1QxNe2AksCnwGHBe1g7lLI7H5QYK2KraPrjkMZuXcfmA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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Image('./imgs/axies-flat.png')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "id": "5e00fbcb",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-10-15T03:55:10.352892Z",
     "start_time": "2023-10-15T03:55:10.343537Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[0, 1, 2, 3],\n",
       "        [4, 5, 6, 7]])"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x[0]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "id": "d6516bb0",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-10-15T03:55:13.996064Z",
     "start_time": "2023-10-15T03:55:13.988627Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[ 8,  9, 10, 11],\n",
       "        [12, 13, 14, 15]])"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x[1]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3d86d569",
   "metadata": {},
   "source": [
    "## 2d transpose"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "id": "5336e886",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-10-15T03:56:14.924956Z",
     "start_time": "2023-10-15T03:56:14.916109Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[[ 0,  1,  2,  3],\n",
       "         [ 4,  5,  6,  7]],\n",
       "\n",
       "        [[ 8,  9, 10, 11],\n",
       "         [12, 13, 14, 15]]])"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "id": "77a13bc0",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-10-15T03:56:37.694088Z",
     "start_time": "2023-10-15T03:56:37.684341Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(8, 4, 1)"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x.stride()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "3a508408",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-10-15T01:41:15.168117Z",
     "start_time": "2023-10-15T01:41:15.160991Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(8, 1, 4)"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x.transpose(1, 2).stride()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "id": "1d5bd9c2",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-10-15T03:57:01.496410Z",
     "start_time": "2023-10-15T03:57:01.485743Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[[ 0,  4],\n",
       "         [ 1,  5],\n",
       "         [ 2,  6],\n",
       "         [ 3,  7]],\n",
       "\n",
       "        [[ 8, 12],\n",
       "         [ 9, 13],\n",
       "         [10, 14],\n",
       "         [11, 15]]])"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x.transpose(1, 2)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2d86c3a1",
   "metadata": {},
   "source": [
    "### 交换 axis 0 与 axis 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "id": "014ab6ff",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-10-15T03:58:21.114991Z",
     "start_time": "2023-10-15T03:58:21.104309Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[[ 0,  1,  2,  3],\n",
       "         [ 4,  5,  6,  7]],\n",
       "\n",
       "        [[ 8,  9, 10, 11],\n",
       "         [12, 13, 14, 15]]])"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "id": "de79e5df",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-10-15T03:58:19.368977Z",
     "start_time": "2023-10-15T03:58:19.358888Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[[ 0,  1,  2,  3],\n",
       "         [ 8,  9, 10, 11]],\n",
       "\n",
       "        [[ 4,  5,  6,  7],\n",
       "         [12, 13, 14, 15]]])"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x.transpose(0, 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "21be24ac",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-10-15T01:54:16.651209Z",
     "start_time": "2023-10-15T01:54:16.643592Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAOYAAADcCAYAAABki91wAAAgAElEQVR4Xu2dd1wU1xqG3wVsFGki9qgRvTHGErHexGhs0USNiWLvJWosqDGWaNTEqLEXrBHBjooVRbCisSRgLDfRXEHKDXYEQaQoyN7fWXYREJidPbPLjPvNPzHMnDPvec/37HfOtKMCbeQAOSA7B1SyU0SCyAFyAAQmBQE5IEMHCEwZdgpJIgcITIoBckCGDhCYMuwUkkQOEJgUA+SADB0gMGXYKSSJHCAwKQb0deA2gHkAfAUKDAOwQHvMJADb9T0BHffKAQKTokFfB+oBuA8gvogCpQAkAhgOwEELKPtvlr4noeOyHSAwKRJmApgCwALAMgAbAfwF4HstXCMBMCj/0GbMmwC2ASivPa4bgAStjSyeKgF4CKArAB8A9mSxeAcITPGevWklZgA4DOBjAN8BcAUwBMAKACUBMPCOA9ANZRsBeB/AOABNABwDcCefKW8BuKAdxk570wwzRXsITFO4LO9zzAHQC0AmgMoAnABYAbinHZbWAaDOBebvALwBNAcQDaAPgNBcTWSZlEHJQGZZM0PezTdIHRuesyG70TYC02jWKqLiKgBiATQE4A5gEQBnANMBjAZgC2A2gNW5wGQxwwLTD8BJAAe1mVbX4BMA3tECmwbgyhs4x2RtvgpgpbEAJTAVwY/RRLLMeBSAGwA2d/xEmwnPA/AAUBHAUgD1tcNZdlWWHcfmjmy4egNAb23mZCLrav+WW7AdgGdGa0HxVNwawBktlGzILzmgBGbxdCydVfkOhAD4SNsMNqyVFFACU/kBQi0oHgd0WTP32SUDlMAsnk6ls74ZDuTOmpICSmC+GQFCrSgeBwrKmpIAao5gstsD7EojbeSAqRwQPcQlME3VNXQecgD4HwCWZWOEzCAwhRyi/eQAvwNJ2qu27MqtXg8mmCOY/DZTDeRAtgNCc0zRQOqMJTApxMgBwx0o7KqswUASmIZ3BpUkBwrLltxAEpgUXOQAnwO5s6VkQBKYfJ1Cpc3bAd3cUnIgCUzzDixqPZ8D7O2Sa9orrXpdZRV7Orr4I9YxOp4cyH7tzShAUsak8CIHZOwAZUwZdw5JM18HCEzz7XtquYwdIDBl3DkkzXwdIDDNt++p5TJ2gMCUceeQNPN1gMA0376nlsvYAQJTxp1D0szXAQLTfPueWi5jBwhMGXcOSTNfBwhM8+17armMHZAUTDXAPnSl2VS5/m1w+8Ne1Ycmuf5tcIWvFazg4mKzMDMzq5Wzsx1u335UQ7qqi66pVq3y0fHxybCysgiJi0thC+88KqAE6SvExjfEv0KDRGow2eIzOjD5676sWcwme3OXdsnAt95y7PfkSdqGTZsG2ri5lUfDhlVNxWTOea5di0V4+EMMG7Y1tVy5skNjYuJ263aSPuHuULJ/Qq3jhyfXGdTZq0LJHkwW9HXqVFgTHOwpm7UbO3RYnhQR8XBUTMwTP9InFLav71eSf/q0zhzBrGBvXzoyMXGltT4GmfIYW9vxaSkpz93t7UuHkT7xzivEv2oAHgu1zuzAdHa28V23ru+gnj3ZqnPy2nbtCsX48bsj1q7t40b6xPeNEvybMGHP5ri45GFCrTM7MB0draNOn55UozjmlEKdceXKP2jXbnnm6dOTrEifkFuv71eIf5FPnqTWEmqd2YHp5lY+Ojz8x+pCxhTX/tq1Z2aGh89j61bKciN9fN1Su/asmIgI4av/eoOpBiwBsHlZqgp4WZA8hVz8UavVG/jcNWJpleorkD7DDVaCf9l3E4veBA9QAy21K+ay5cDZL3mmdvluTxVwKXf1eoF5Q7N8eMHbu/lWHjbO7RICUygqitivhMCX+w+bVGCyBVD8AJwGkA6gNIAOAL5UAXluyOsFZm7Y8gdA/nuVBCYHQsYpSmDy+cr8kwrMuwDWAjgBIE0LZjsAY1RAnrvyeoF5BR8hC4cAzIIlfs3TzEaaTwK+2ghMvigwQmkCk89UKcFsD2ANALdckqIBjFABp0QPZVmBP9ALWeiIJhhaZDMJTL4oMEJpApPPVMnA1MlQZ39L0w7AMxXwpCB5emVMMe0iMMW4ZZJjCUw+myUHUx85BKY+LhV9DAU+n4dK8E+SOaYYmwhMMW4VfKwSAkvuVz3lrk9SMNWAM4AyACoB6AZgkwpgc82cTRSYv8MZpVEGL7T1lcQmNMhbH2goy0+6xDXQDwefoZIPZdXABQA+AKZrb5uwuWYzg8EMwwWo4AM1pkOFdKjxDE3y1kdg8gWBMUoTmHyuGgNMdsGHLT92FUBlABEq5H1YQFTGvIwnsEBrZL2qD+75Hj6QecacP/8YfHwu4uXLLPTv3wxz53aBSiX4zEaRPSt14Ccnp6NNm2Xw8uqN5s1r8kUVG4NJ9GRSRsZLeHruxqlT/9Voql+/Ctav7wcnJxsujVLpe/EiE+PG+eHMmVuaPv3ss/ewaNGXsLS04NYn9VD2FoA4AEzZXgBDVcB7HBnztfrQJG99cs6YgYF/4rvvDuH8+SnsKwTo1Gk1hg//AH37NuXuOKnmSCdP/q0JrujoxwgJmSwrMJctO4GTJ/+LQ4fGaPwbPXon1Go1NmzoLwv/liw5jnPnInDgwGhkZanxwQeL4OnZFn368Pev1GAyRf0ArAfQHMBfKiCMA8ymUKEfVNr6LPAXGuWtT85gjhixDbVru2LKFPYQFLB9++/YuTMUgYHjZBFYTES3bmsxdWpHjBy5HZs2DZAVmJcuRcLOrjTq1WODL2hGHvv3X0VAwNey8C8rKwvPn2eiTJmSSEhIwYcfLsaSJT3QqVM9bn2SgKkGBgMIANAlvyIV4CsazD8wGJkIgNXr9aFx3vrkDOYnn6zC4MEt0Lt3E40FISG32LuU+M9/vufuOKkypk5IvXpzZQdmbpMeP36Gli1/xoIF3fHll+/Lyr+5c49g9erTmh+QY8fGaUDl2SSbY6qB2wA+B8BW0c2zqYA875XpNce8jNtQ43OoXq8P7nnrkzOYHTqswNCh/84D5sSJe3H16kyefpNsDpdbhJzBZN886t59nWYaMHEie9KTb5NqjplbRWbmSwwduhWWlir4+LA8ZfgmGZg6CWrAXgWwNec1mxqoqQKiRGdMXYHLsIf7q/oQhppokrc+OYM5fPhWvPNORUyezJ5YBHbs+B1+fpdlMxRTApjBwTfApgSrVvXG55+zl5f4N6nAPHs2HOXL22n6mG1BQX9hypR9+PPP2VwijQHmPwCGax9mZxOpBSogzyU0vTKmrllh+AcqDEdjnMAf0NQH97z1yRnMgIDrmDXrMM6d+walSllpLv7069cUw4Z9wN1x5jCUZVc7Bw70QXDweNSty26NS7NJBeZPPwXi/PnbOHz4a7AL7YMG+aJcOVusXNmLS6gxwJwFYAaAO8h+2GC6CsjzxrEoMC9jFtSYAZW2PnY/s0ne+uQMJuudBQuOYcuWS3jx4iW6dWuApUt7wMKC/3K6OYDZosXPuHw5BqVKlcgJ9Pffr6b5oePZpAKT3c6ZNGkvTpy4qbld0rp1bSxd2hPW1jKZY+YaurKsNg/Ac+0DBmNVwGGOoew4qDEPKjyHWvOe51g0yVuf3MHkCaDCykoVWMbQxuokfXzOGiNjsgcMJgHYBmAKgNmq7JemczaRGfMJVJiEp9gGu+z64J63PgKTLwiMUZrA5HPVGGBWVgHspWnNpgbcVcBlg8G8hspo+Ko+XIE73s9bH4HJFwTGKE1g8rlqDDDnAhgFgE0K2BfX2VXaPF9zE5kxX9Wnzq4PTfLWR2DyBYExShOYfK4aA8xkAN9pr8yuZA+WqICuBmfMy3hVnxqa+tAkb30EJl8QGKM0gcnnqjHAZPcwWwDwB9AHwD6DHjDQtSsMSbBEC2TBHxbogyzsU9IDBnzdU3hpCnw+Z5XgnySP5OWaU7JnzTK035Zlj7ccVwEdOTLma/XBPW99lDH5gtQYpZUQ+FLfbpLSR8kzZj4AqwB4oMr+xmzOJmqOmbvgdVRBAh6gTd76CEwpQ0KaughMPh+NCmZh0gwGs7AKZf4+Jl8XFVyaAp/PVSX4J+lQVh+7lAAmrV2iT08WfgytXcLrn8Rrl+gjRwlg0mpf+vRkwccoZDUtua+WRqt9FRReLi52m728eg/x8JDf+ph+ftnrY3p59XEjfeJ/QJThn593XFwKexmkyI3vAzX5qlZCxgRQ3ta2VHRy8irZrShtYzMuPTX1RQNb21JXSZ9Q6L6+XyH+sU82JAi1zhzBRPXqLr3c3Jw3HD8+0V7IIFPtb99+eVJkZPzw6Og4f9In3nUl+adP68wSTGZM9eqOvePiUjf/8kv/MnXqVAB75cjUG5uzsTf4hw3bmu7qaj+AQanTQPqEe0PJ/gm1zmzBZMZUq1atboXK1Q5alShZ3a6sA57Ex716OVDIOc79js4uGclPE5GZ+Tzq7v/ud717Nyo8f5Wkr3CT3wT/igohswWzY7eefdOSn27sP3qqjUvFKqhaI/diZpzU6Vk8NjoCj+7HYvu6Ral2Ze2HBB7cs0dXlPQJm6hk/4RaZ5ZgsqCvUKnqmnEzl7IVzGSxrfphcmLcg9hRxw7t3U36xHeJkvzTp3VmB2azZs1cS9k4RC7bFsT3yW993BV5jGe/DmmpT5Mb2zrYh5E+keYBUIJ/L1KTqoaGhsYLtc7swGz7SRdfj2Gegxq3/FjIG5PvDzt/Ens3r4roNdzTjfSJt18J/vn7rPY+FXSY7mPm796P2nWO8pyzokZxzCmFQu2fqHCsmuuZMWHOyhKkT8it1/crw7+JkSEnA/N8j7mglppdxvzsi95Rc1bvqiG+201TYva4vhlzV+802dVhsa0ifWIdy3v87LF9Yo4e8BOMP7MDs2mLD9Vr/c/xuWvE0mN6tALpM9xgJfgXeulXQe4EDxBjkRIeySMwxfTo68cqIfDl/sNGYBYQgwQmgcnnAF9p9sNGYBKYfFFUQGnKmHyWEpiF+EcZkz+w5D5UlLs+ypiUMfkopIxpFP8ITALTKIEl94wkd30EJoFJYEruAF+FNMekOSZfBBVSmi7+8NlKYBKYfBFEYBrNPxrKGnEoq1arsfLHKTh3/DBUFhZo2PQDTJu/FiVK8i1sKlVGevH8OZbMnoDQX0+iVOkyaPNJd4yYNBuWlpZcAcerL+jATgTu24ZV24/l6Dh/8ihWz5+K9PQ01KnXCN8v8YZtWcO++sKrj4lKeZaMUT3b4Nt5XnivcfMcnVHhNzHa42MEX3tgsIeUMY2cMUOCDmLj0jnwCfgNViVKwHPgp/ig7afoNZSt72v4JkVgsbNvXDYXf/5xCYs3HUDJUqUwZ+Jg/Kve++g7wtNwcQAM1fcs+SnWLZqJI3t8Ud+9JVbvCNLoeBIfB48278L74AVUq+mGNQtnIDHhMb5btNEgnYbq053s919PYvHMcbgXG40Ne0M0YGZlZcF/6zpsXvUTniYm4GIUW2fZsI3ANDKYug70DfgNJUuVxvgBndCxWx907zfCsB7TluINLN3JPQd+hraf9UAXj8GaP506ug87f1kO74Pni0Xfkb1bEBt9G9Vq1kbQgR05YB7bvwNBB3di5dajGl0P791Bj4/+hbO3nsLCwkK0Vl7/Jg3phkFfT8X8b0di5uJNGjAjb93AljUL0e+ryRjSpTmBaYy1S6R6wIANZWeO7acZyrLh69t16mGt30nZDGVZNr9++SIWrt+j0fT9+AG4deMaDl2MFB3suQvwBv6pI/44uGtTDpi+Xgtx704MZixcrzkN87VJFQuc+ise9o5OorXy6tOdsNfH9XLA1P2NZfLO7lUITDmDuWnFj/jjYgiWbD6IEiVKYt6U4bC2scO0BWtFB5OUga+r63l6Olb8MBkXTgfC3tEZnb7oj/3bN8D/7N/Fqi8/mJtXzceDe/+8BmbI34kGzTMJzAK615zeLhnbtyM6dOuNrr2GaJy4FnoeP34zHPvO/bdYA1938oTHjzTZx9nFVfOno/7bcDJgD5ZvCShWffnBDNy3HScO787R9ej+XfRsUxcMTJVK/MtPBKaZg8mGijeuh2Gp90FYWllh6WxPPHuahDkrfIs18HUn37dtAy6cOoqlPoeQkvwUX/VojUFjp6FD117Fqi8/mOwHhF38+WX/OdRwe0dz8efhvVj8sGqbQToJTDMHk92OYEPFiyFBmqEsu8zPLq+XdXA0KKB0haQKrMzMTMyf+hWuh13Ay5eZ+HLAKAwY9Q2XNlaYV19+MFmdF04FYvWCaXienqb5jCiD0sHR2SCtvPpojqlz4Coc8BK+UGMFmiAkT28UtT5mGFpDBU9YYjAaIVHfXpTq4o++5xN7nFSBJfa8+h5P+vR1quDjlHW7JAxzoMJsACFQY24OoAWBmQ0kO7a19tg5YqwiMMW49fqxBCa/f8p58ic7a8YA0D3ukQ2oCmdybFCjTQ6Q2X9MgiWqi8mWrBCByR9Ycn97Q+76lAMmi5VXWVO/yMnOrKKyJYGpn7VFHUUZk89DZQ1lWVtfz5pFOWBQtiQw+YKKlSYw+TxUHphisqaB2ZLA5AsqAlMa/5Q1lNU/axqcLQlMaQJL7nM4uetTHpj6ZE2ObElgEpj8DvDVoMyhrHDW5MqWBCZfUNFQVhr/lJkxi8qanNmSVf1p997Rc712Vee32Dg1zB7bJ2Ou1y75rl1C+rg6fs64PtFH9vvVFKpE/FPCRdQo2UPsBV+h5c6WTDqt9iUUEoXvV8ZqWnJfLU3pq33lv68pQbZkIde2Y1dvj2EThjb+txzXxzwFf59V4R5DJ9QmfeJ/QMLOK8G/ld6nggIUvD5m3qwpSbZkXd2o0Ycuto7WMcu3BVmL73rjlvDs1z79WVpyfTsbh2ukT7zXSvAvKTO90p/nzz8Rap08h7I61bqsKVG21FXb+XMPDxfXKhvGfb/UQcggU+1f9cOkxLgHd0YcO7TXn/SJd11J/unTOnmDmZ01r8ESDcU+EyvU+E7devZKTkr06Tfq2zKulatpvkVj6o3N2R7di8X2dQvT7ewdBzAodRpIn3BvKNk/odbJG0ym/qrmQXX2gLvkW9OmTZ3tnCr8/DIzs7WNnb1l3IM7Jrta61KhckxK8tOXllZWIY+eJUwpaHhD+grv8jfBv6ICWv5gSo4jVUgOyN8BAlP+fUQKzdABAtMMO52aLH8HCEz59xEpNEMHCEwz7HRqsvwdIDDl30ek0AwdIDDNsNOpyfJ3gMCUfx+RQjN0gMA0w06nJsvfAXMHs4KLs/XCzMysVs5OZXA7+kkNU3VZrRqO0fEJabCysgiJi0+dBuBRAecmfYV0yBviX6HhZrZgvlWlbL8nSekbNi3rYuNW0wkN61UwFZM557n21wOER8Zj2MQjqeWcygyNiU3ardtJ+oS7Q8n+CbXOLMFkQV+nVrk1wbv7GbaeuJCrBuzv4LE9KSIqflRM7FM/0ifeQCX5p0/rzBHMCva2JSMTI6fK7n1M2xoL01JSM9ztbUuGkT59wjfvMQrxrxqAx0KtMzswnZ1K+677ufOgnl3fFfLG5Pt37f8L42cFRaxd0MmN9Im3Xwn+TZgZvDkuPnWYUOvMDkxH+9JRp/cPqFEcc0qhzrjyn/to12N75un9A6xIn5Bbr+9XhH89t0c+SUyvJdQ6swPTrYZjdPhvY0323qVQB+TfX7uFV2b4pbFWYsuZ6njSx+d07eZeMRF6XP03OzABqNUPZ/G5a8TSKtcfQfoMN1gJ/gEQ5E7wADEWSfb5SjEnFX8sgSnes5wSSgh8uf+wEZgFByCBSWByOMBXlP2wEZgEJl8UFVCaMiafpQRm4f5RxuSILQKTwzyWKiljFmoggckRWwQmh3kEZpHmEZgcsUVgcphHYBKYfOFTeGkCk89ZGsrSHJMvggopTWDy2UpgEph8EURgGs0/ul1iotslE2cdR/Q/iTi4xYO7M6XMSHVarsWd+09zHjOZMKIZfprRhkujlPq2+/+JpesuITUtE/Xrlofvyq6wsSkpC319Ru1HQHB4jpaMzCxUr+qAWxfHcOsjME0A5p5DNzF2xjG0dK8qKzDjE1JRq/kaxN2czL6SwBVMuQtLBebZi//DwHGH8FvgEFQob4sBXx/UBP686fL54dC1OzEpHS0+9cHq+R3RrpXgYtBFek1DWRMMZf8Oj8PgCYcxsGd9nDgbLSsw2a/9uO+CULmCHe4/fIZP27th0ay2KFOGbxV5qcAcPikAtWs649uxLTU9xX5I0tIzUaVSWa4fEan05RYxcOxBlC9ngyVz2nNpY4UJTCOD+SzlBdp8sRVbVnVD6NV7OHjslqzAZO8mBp66jTULO0GtVsNjxD7Ure2C5T924AouqQK/VbctaPPv6jhxNgr3Hz1Dq+bVsHJeRzjYl5aFPp2IsKv38Gn/XYgKHQdbzmE2gVl010pyH9NjhD8+7/Qv9P2iHnz9rssOzPwWsKHjUM8ARIaOlUXgt+i8GVlqNQK29oZ92VL4aspRWFiosHlFV1no04noOdxfM/+dNakVly5dYcqYRsyYj+JS8HYzL9hYZw8L2RDs+YtMNGlYCb8eHszVgVJlpH1H/kalCnZo4V5FoyfkQgxGTz2Gv8+PloW+L4fuReP6FTHD8wONHvbDMWZaIG6ck4c+pin52XOUf3cZbl0Yg2pVpPk8FIFpRDDzVy3HjLl4zUUEHI/A8d39NJnoy2F74d6gImZ/85EswGRD7aXrf0PIgYGaHzh2ZTs55QW8l3eRhT4mIvhMJCbNPs79Y5G7QQSmmYOZmZmlCargM1HIyHiJzu1qYfkPHVCihKVsAn/Z+t+wacdVvHjxEg3edcWmZZ/B0aGMbPSt3Pg7zofGYu+mHlyaCEz97JNkjqnfqcQfJdVQVvyZ9StB+vTzqbCjKGOaMGPydVXe0hT4fG4qwT96wKDgPqaMyRH7Sgh8+rRIvg6mb/5wRLy2KAU+n4dK8I8yJmVMvigvoLQSAp8yJmVMCnzJHeCrUAk/HJQxKWPyRTllTKP4R2ASmEYJLLkPFeWuj8AkMAlMyR3gq5DuYxbiH61dwhdYtHYJp3+0dknBBtJqX4YHliJW05L7amm02lfBAejibL3Za2GnIR5d6xoeoUYq6XfgL4yfGRThtaCzG+kTb7Iy/Av2jnucOlyodea4qFB5W5uS0clR8ltR2qb6wvTUtIwGtjYlr5I+odB9fb9C/KsMIEGodeYIJqpXte/lVtNpw/E9/aV5yU7IZT32t/fYnhQZnTA8+p8kf9Knh2H5DlGSf/q0zizBZMZUr1q2d1x82uZfln1Wps7bzni/fkV9/JL0GDZnC4+Mx7CJR9JdXawHMCh1JyB9wlYr2T+h1pktmMyYatWq1XWtVOWglVXp6ta29khOesz3pSoht3Ptt7Mvl5H6LAkZGelR9+886Hr3btSrbyVqjyN9hRv6JvhXVLiYLZjtOvfs+zz16cbOHlNtnMpVgWtlNxFYSXPow7sRSIiLxZE9i1LLlLUfcjJgzx5dzaRP2GMl+yfUOrMEkwW9s0vVNX1GLnUQMshU+3dunJwYHx876tSRvbtJn3jXleSfPq0zOzCbNWvmWtLaIXLyvCAbfQwy5TGLZ3RIS0tObmxjbx9G+sQ7rwT/MtKSqoaGhsYLtc7swGzdvotvh+6eg+o2+FjIG5Pvv3HlJI4fWhXR8QtPN9In3n4l+Hfi8GrvkBOH6T5m/u5t1aZzVL/RK2oUx5xSKNQe3AnHzg2eGf1GrSxB+oTcen2/EvzbtWFi5NnTgbWEWmd2GbNjl95Ro6ftqiFkTHHtX7egb8bo6TtNdnVYbDtJn1jH8h6/bmGfmOAAP8H4Mzswm7b4UD1jyTk+d41Yev43rUD6DDdYCf6FXvpVkDvBA8RYpIRv/hCYYnr09WOVEPhy/2EjMAuIQQKTwORzgK80+2EjMAlMvigqoDRlTD5LCcxC/KOMyR9Ych8qyl0fZUzKmHwUUsY0in8EJoFplMCSe0aSuz4Ck8AkMCV3gK9CmmPSHJMvggopTRd/+GwlMAlMvggiMI3mHw1ljTCUPXd8J0KCt+H7pcdyag86sB5H963W/L+NrQO+mrwGNdwaGtSxvBmpIH1H/b0QuM9Lo6dytToYM+0XODiWl40+nZDfzx3E6vlDsT1I8JM4hWo3hn9rF32FM8e2wNLSSnPemrXfx/y1hj09RhlT4oyZmvIUOzbOxOlAX/zrvZaYvSxIc4bb//0DC6Z1w1KfK5pgP3diF/w2z8HaXbdMGviF6vv7MhbM6I4VW67DrqwTNq+ahPT0FIz5doMs9OlE3IuNwI/fdMbTxDjsCE40SBsrZCiYhfnH6hw/4D2Mn+GDWu+4G6xLV5DAlBjM04FbcP/ubVSuWhtnj+/IAfPB3Sg8vBeFBk3aac748F40PAc1wM7jSVCpxD/xaGhgFaaPaXqenopSpa2RmZkBrwXD4FSuEgaOXmhQkBlL36zxH6PnoJlY8UP/YgGzMP9SniVh0KcuaNCkPWJjbuKtt9/DyIlecKlQzWD/aChrhKHsxTP+OBGwKQfM3KfIysrC4lkecHSuiJGTsoe2YjdDA193nsL0hV04gl+Wj0Nmxgv8tPYcKlZ+W6w0zfHG0Ld8bn80bNoB7zZshYmDGxYLmIX5Fxt9E94rPTFy8hq4VqyBXd6zceW3Y1jmc8Vg/whME4KZlpKMFT8OgFWJkpg4ewesrAx7c8sYgZ/bhuBDG3Fg+89YuzsCFhYWooNLan2B+9Yg5vZ1jJm6EY/ux8gOzPwGsVFH77Y2WL8nEuVcqxrkH4FpIjDZcHb+1K5o/tEX6DN8rkFD2NxzEJ4b5Pkz5t1/wpEQdxfvNW6jOcXz52no9bE1tgY+Rll7Z4MCS0p9k4c2xuOHsVBZWCAr6yWSk+Jh71geK7f+CXtHl2LXd/vvy5opzIftemu0MDCZf94H78DBydUgfQSmCcBMTHiIKcObYtDXi/FBWw/RHZW/gNQZ6eb181jyfS8s84YC3f4AAANjSURBVL2quTh1bP9aBB/aoLkYZMgmtb7cGuSYMcNvhmLelE+xbPMVTYb03zof18JOYN7qM4bYp5kKEJgmAHPb+unYv/1nzcWV3JtvwEOULiP+e1/GCHw2fD2yd6VGnovrW5rbOa6VBF+iLzDwjKFPdyI5gsm0sWsKh/yWaebnlaq6Yew0bzi5VJIXmGqAffLRF8AKFRCSW11RL0qrgdYAPAEMVgGGXw83yI5XhejtEj4DecHkO7twaSXoM1rGVANzAMxGNphzdYAWBKYWSHYsA5Mdy8oW20Zg8lmvhMDnmQPzuSNc2qhDWW3WjAGgW5RHAyiA3ANvdrVBByRTnMSWDCnObMlEEJjCwVPUEQQmv39Gy5hMWq6sqa/SYs+WBKa+XVX4cQQmn4dGzZhaMNlcM3fWLEqxLLIlgckXVKw0gcnnodHBFJk1ZZEtCUy+oCIwpfHPqENZEVlTNtmSwJQmsOR+cUXu+owOpp5ZUzbZksAkMPkd4KvBJENZPbKmrLIlgckXVDSUlcY/k2RMgawpq2zJtHbs0jt69LRd1fktNk4N6xb0yRg9fZdhT8AbR1KeWkkfn8nrFvaJDg7wqylUi/gXBguosYD7muwo2WVLJopW+xIKicL3K2E1Lbmvlmby1b4KuK8pu2zJQu6jdl29P+k+Yeg7DWW4PubVU2x9zPBPPp9Qm/SJ/wG5oQD/Thxa6R1yIsB062Pmy5qyzJasqxs1+tDFuqx1zJT5QXmfOhcfB5KXWDy9fXrK8+T6NqUdrpE+8fYqwb+nWemV/jx//olQ6yQZyupOkitryjJb6nS26+Lh4eRUZUPfkUvZQxKy2HZumJSYmHBnxPEje/1Jn/guUZJ/+rROajBZoF8D0LC4n4kVanzbz3r2Sk9O9Onc49syzuWroUKV2kJFJN/P5mzxcbEI3LMw3aas4wAGpe4kpE/YbiX7J9Q6ScFkJ1NnP6jOHtWT/da0aVNna/sKP6tfZrYubWNv+eTxHZNdrXUqVzkmLeXpS5WlVUh8WsKUgoY3pK/wEHoT/CsKEMnBlD2NJJAcUIADBKYCOokkmp8DBKb59Tm1WAEOEJgK6CSSaH4OEJjm1+fUYgU4QGAqoJNIovk5QGCaX59TixXgAIGpgE4iiebnAIFpfn1OLVaAA/8HNns7RYGHzSwAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Image('./imgs/axis-swap.png')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "50481a7d",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-10-15T01:50:54.830212Z",
     "start_time": "2023-10-15T01:50:54.821849Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "torch.equal(x.transpose(1, 0), x.transpose(0, 1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "b95545b3",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-10-15T01:50:10.766004Z",
     "start_time": "2023-10-15T01:50:10.755783Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Image('./imgs/axis-swap-flat.png')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "id": "8c639455",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-10-15T03:59:25.302547Z",
     "start_time": "2023-10-15T03:59:25.296489Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(8, 4, 1)\n",
      "(4, 8, 1)\n"
     ]
    }
   ],
   "source": [
    "print(x.stride())\n",
    "print(x.transpose(0, 1).stride())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3a368929",
   "metadata": {},
   "source": [
    "## 3d transpose"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "id": "4af3e633",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-10-15T03:59:44.409770Z",
     "start_time": "2023-10-15T03:59:44.403471Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[[ 0,  1,  2,  3],\n",
       "         [ 4,  5,  6,  7]],\n",
       "\n",
       "        [[ 8,  9, 10, 11],\n",
       "         [12, 13, 14, 15]]])"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "id": "bc250157",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-10-15T03:59:45.577306Z",
     "start_time": "2023-10-15T03:59:45.568634Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[[ 0,  8],\n",
       "         [ 4, 12]],\n",
       "\n",
       "        [[ 1,  9],\n",
       "         [ 5, 13]],\n",
       "\n",
       "        [[ 2, 10],\n",
       "         [ 6, 14]],\n",
       "\n",
       "        [[ 3, 11],\n",
       "         [ 7, 15]]])"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x.T"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "id": "c6784a9a",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-10-15T04:00:07.558940Z",
     "start_time": "2023-10-15T04:00:07.551344Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(8, 4, 1)\n",
      "(1, 4, 8)\n"
     ]
    }
   ],
   "source": [
    "print(x.stride())\n",
    "print(x.T.stride())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "cf203de4",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-10-15T01:45:39.650224Z",
     "start_time": "2023-10-15T01:45:39.639185Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[[ 0,  8],\n",
       "         [ 4, 12]],\n",
       "\n",
       "        [[ 1,  9],\n",
       "         [ 5, 13]],\n",
       "\n",
       "        [[ 2, 10],\n",
       "         [ 6, 14]],\n",
       "\n",
       "        [[ 3, 11],\n",
       "         [ 7, 15]]])"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 2, 2, 4 => (4, 2, 2)\n",
    "x.transpose(0, 2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "ebbf8834",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-10-15T01:45:47.122845Z",
     "start_time": "2023-10-15T01:45:47.113065Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[[ 0,  8],\n",
       "         [ 4, 12]],\n",
       "\n",
       "        [[ 1,  9],\n",
       "         [ 5, 13]],\n",
       "\n",
       "        [[ 2, 10],\n",
       "         [ 6, 14]],\n",
       "\n",
       "        [[ 3, 11],\n",
       "         [ 7, 15]]])"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x.permute((2, 1, 0))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "b6866ec4",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-10-15T01:46:01.788546Z",
     "start_time": "2023-10-15T01:46:01.781317Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[[ 0,  8],\n",
       "         [ 4, 12]],\n",
       "\n",
       "        [[ 1,  9],\n",
       "         [ 5, 13]],\n",
       "\n",
       "        [[ 2, 10],\n",
       "         [ 6, 14]],\n",
       "\n",
       "        [[ 3, 11],\n",
       "         [ 7, 15]]])"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "torch.einsum('ijk->kji', x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "fe65f323",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-10-15T02:06:03.903713Z",
     "start_time": "2023-10-15T02:06:03.892846Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[[ 0,  8],\n",
       "         [ 4, 12]],\n",
       "\n",
       "        [[ 1,  9],\n",
       "         [ 5, 13]],\n",
       "\n",
       "        [[ 2, 10],\n",
       "         [ 6, 14]],\n",
       "\n",
       "        [[ 3, 11],\n",
       "         [ 7, 15]]])"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x.transpose(-3, -1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "de2a2937",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-10-15T02:06:34.023992Z",
     "start_time": "2023-10-15T02:06:34.013609Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "tensor([[[ 0,  8],\n",
       "         [ 4, 12]],\n",
       "\n",
       "        [[ 1,  9],\n",
       "         [ 5, 13]],\n",
       "\n",
       "        [[ 2, 10],\n",
       "         [ 6, 14]],\n",
       "\n",
       "        [[ 3, 11],\n",
       "         [ 7, 15]]])"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x.transpose(0, -1)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.9"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
